/**
 *思路和call差不多
 * @param {*} context
 * @param {Array} arrArg 一个类数组对象，用于指定调用 func 时的参数，或者如果不需要向函数提供参数，则为 null 或 undefined。
 * @returns
 */
Function.prototype.apply = function (context, arrArg) {
  // 校验调用者
  if (typeof this != "function") throw new TypeError("调用者必须是一个函数！");
  // 看浏览器第二个参数不传数组会报错，可以加一个判断
  if (arrArg && !Array.isArray(arrArg)) throw new TypeError("第二个参数是一个数组");

  // 处理类型
  context = context == null ? window : Object(context);

  // 添加属性并执行
  const _pro = Symbol("p");
  context[_pro] = this;

  let res = arrArg ? context[_pro](...arrArg) : context[_pro]();
  delete context[_pro];
  return res;
};

// eg
function fn(arg, arg1) {
  console.log("arg2", arg, arg1);
  console.log(this);
}

fn.apply({}, [1]);
